/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package sistemadeleiloes.model;

/**
 *
 * @author William
 */
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Collections;
import java.util.Date;

public class Leilao implements Comparable<Leilao> {
    //Atributos
    private int id;
    private Date dtInicio;
    private Date dtFinal;
    private int status;
    private double valorInicial;
    private double valorArremate;
    private String senha;
    private Produto produto;
    private Usuario leiloeiro;
    private final List<Lance> lances;
    
    //Constantes de status
    public static final int ENCERRADO = 0;
    public static final int EM_ANDAMENTO = 1;
    
    //Construtores
   
    public Leilao(Produto produto) {
        this.lances = new ArrayList();
        this.produto = produto;
    }

    public Leilao(Produto produto, int id, Date dtInicio, Date dtFinal, int status, double valorInicial, double valorArremate, String senha, Usuario leiloeiro) {
        this.lances = new ArrayList();
        this.produto = produto;
        this.id = id;
        this.dtInicio = dtInicio;
        this.dtFinal = dtFinal;
        this.status = status;
        this.valorInicial = valorInicial;
        this.valorArremate = valorArremate;
        this.senha = senha;
        this.leiloeiro = leiloeiro;
    }

    //Getters e Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getDtInicio() {
        return dtInicio;
    }

    public void setDtInicio(Date dtInicio) {
        this.dtInicio = dtInicio;
    }

    public Date getDtFinal() {
        return dtFinal;
    }

    public void setDtFinal(Date dtFinal) {
        this.dtFinal = dtFinal;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public double getValorInicial() {
        return valorInicial;
    }

    public void setValorInicial(double valorInicial) {
        this.valorInicial = valorInicial;
    }

    public double getValorArremate() {
        return valorArremate;
    }

    public void setValorArremate(double valorArremate) {
        this.valorArremate = valorArremate;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public Usuario getLeiloeiro() {
        return leiloeiro;
    }

    public void setLeiloeiro(Usuario leiloeiro) {
        this.leiloeiro = leiloeiro;
    }

    public List<Lance> getLances() {        
        return lances;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }
    
    
    //Outros métodos
    public boolean registrarLance(double valor, Usuario p) {
        Lance l = new Lance();
        l.setParticipante(p);
        l.setValor(valor);
        l.setDtCriacao(Calendar.getInstance().getTime());
        
        lances.add(l);
        return l.equals(this.getMaiorLance());
    }
    
    public void arrematar(Usuario p) {
        this.registrarLance(this.getValorArremate(), p);
        this.encerrarLeilao(this.getSenha());
    }
    
    public boolean encerrarLeilao(String senha) {
        if(this.getSenha().equals(senha)) {
            this.setStatus(Leilao.ENCERRADO);
            return true;
        }
        return false;
    }
    
    public Lance getMaiorLance() {
        return Collections.max(lances);
    }
    

    //compareTo
    @Override
    public int compareTo(Leilao o) {
        return this.getDtInicio().compareTo(o.getDtInicio());
    }
}
